import java.util.Scanner;
/*
 * 蘑菇阵
 */
public class Main {
//不能用可行路径/总路径，因为在边上走概率是1，而在里面走概率是1/2！！！概率题要注意
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n = scanner.nextInt();
			int m = scanner.nextInt();
			int k = scanner.nextInt();
			int[][] flag = new int[n][m];
			for(int i=0;i<k;i++) {
				int y = scanner.nextInt() - 1;
				int x = scanner.nextInt() - 1;
				flag[y][x] = 1;
			}
			System.out.printf("%.2f\n", dpSolve(flag, n, m));
		}
	}
 
	public static double dpSolve(int[][] flag, int n, int m) {
		double[][] dp = new double[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				
				//初始化
				if (flag[i][j] == 1)//有蘑菇概率为0
					dp[i][j] = 0;
				else if (i == 0 && j == 0)//初始位置概率为1
					dp[i][j] = 1;
				else if (n == 1) // 只有一行
					dp[i][j] = dp[i][j - 1];//每行概率一样为1
				else if (m == 1) // 只有一列
					dp[i][j] = dp[i - 1][j];//每列概率一样为1
				else if (i == 0)//不在初始位置，不只有一列，里面所有往下走的概率
					dp[i][j] = dp[i][j - 1] * 0.5;
				else if (j == 0)//不在初始位置，不只有一行，里面所有往右走的概率
					dp[i][j] = dp[i - 1][j] * 0.5;
				else if (i == n - 1 && j == m - 1) // 终点
					dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
				
				//计算概率
				else if (i == n - 1) // 底边
					dp[i][j] = dp[i - 1][j] * 0.5 + dp[i][j - 1];
				else if (j == m - 1) // 最右边
					dp[i][j] = dp[i][j - 1] * 0.5 + dp[i - 1][j];
				else // 两种走法，概率分别是0.5
					dp[i][j] = dp[i - 1][j] * 0.5 + dp[i][j - 1] * 0.5;
			}
		}
 
		return dp[n - 1][m - 1];
	}
}